package 定长滑动窗口

import "strings"

func minimumRecolors(blocks string, k int) int {
	//maxS := 0
	////进
	//s := 0
	//for i, in := range blocks {
	//	if in == 'B' {
	//		s++
	//	}
	//	left := i - k + 1
	//	if left < 0 {
	//		continue
	//	}
	//	if s == k {
	//		return 0
	//	}
	//	//更
	//	maxS = max(maxS, s)
	//	//出
	//	out := blocks[left]
	//	if out == 'B' {
	//		s--
	//	}
	//}
	//return k - maxS

	// 初始窗口：前k个字符中'B'的数量
	s := strings.Count(blocks[:k], "B")
	maxS := s // 初始化maxS为初始窗口的数量，避免漏掉初始最大值

	// 提前判断：如果初始窗口已经全是'B'，直接返回0
	if s == k {
		return 0
	}

	// 滑动窗口：从i=k开始（右边界），每次移动一位
	for i := k; i < len(blocks); i++ {
		// 加入新的右边界元素（当前i位置）
		if blocks[i] == 'B' {
			s++
		}

		// 移除左边界元素（i-k位置，即窗口最左侧）
		left := i - k
		if blocks[left] == 'B' {
			s--
		}

		// 提前返回：如果当前窗口全是'B'，无需继续计算
		if s == k {
			return 0
		}

		// 更新最大'B'数量
		maxS = max(maxS, s)
	}

	// 最少涂色次数 = 窗口长度 - 最大'B'数量
	return k - maxS
}
